package com.heima.corss.controller;

/*
    FailFast快速失败机制：   C强一致性。 集合代表： ArrayList, HashSet , HashMap....
        一边通过迭代器遍历，一边往集合中 增/删 元素，这时我们的大部分常用集合会采用抛出异常的方式来处理，
        这种处理方案就是快速失败机制。抛出并发修改异常：CurrentModificationException

        实现原理： 底层基于迭代器的modCount与expectedModCount的比较来实现。当两者不一致就会抛出异常。

    unsafe机制：不安全可用机制。 A高可用性. 集合代表： CopyOnWriteArrayList， CopyOnWriteArraySet,ConcurrentHashMap
            底层采用的读写分离设计，遍历读取的是老的容器数据，增，删操作的新的容器。
 */

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

public class FailFastDemo {
    public static void main(String[] args) {

        //ArrayList<String> list = new ArrayList<>();
        ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();

        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        //CopyOnWriteArraySet<String> list = new CopyOnWriteArraySet<>();
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("javaWeb");

        /*
          cursor: 已经迭代的元素个数 ，初始值： 0   1
          expectedModCount：预期修改的元素个数，初始值： 4
          modCount：实际修改的元素个数，初始值： 5
         */
        Iterator<String> it = list.iterator();

        while (it.hasNext()){
            String s = it.next();

            if (s.equals("hello")){
                list.add("spring");
            }

            System.out.println(s);
        }

    }
}
